// 引入自己封装的接口
import api from '@/request/api.js'

import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',
    userInfo: '' // 模拟存储用户信息（有查询管理员信息接口可删）
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 模拟存储用户信息（有查询管理员信息接口可删）
  SET_USERINFOR: (state, userInfo) => {
    state.userInfo = userInfo
  }
}

const actions = {
  /**
   * vuex的actions同步函数 用户登陆的逻辑接口调用和登陆后数据处理
   * @param {登陆页面传递过来的数据} userInfo
   * @returns
   */
  login({ commit }, userInfo) {
    // const { username, password } = userInfo
    // console.log(userInfo, '888')
    return new Promise((resolve, reject) => {
      api.login.login(userInfo).then(res => {
        this.loading = false

        const token = res.header.token
        console.log(token, 'token111')
        commit('SET_USERINFOR', res)
        commit('SET_TOKEN', token)
        // 设置token
        setToken(token)
        console.log(res, '请求登陆接口成功')
        resolve()
      }).catch(err => {
        this.loading = false
        console.log(err, '登陆失败了')
        reject()
      })
    })
  },

  /**
   * 获取用户信息，进行存储 显示主页欢迎
   * 此处应该通过管理员的 token 请求管理员详情信息的接口
   * 此处为展示效果，并没有调用接口，只是获取了一下登陆时用户输入的信息
   * 因为没有调用登陆接口的原因，又因为vuex没有持久化的特性，会造成刷新页面退出登陆的问题
   * 退出登陆的原因详见，路由导航守卫 permission.js
   */
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      // 以下逻辑自己项目换成调用查询管理员信息接口(正常逻辑是利用token查询管理者信息)
      // console.log(state, 111)
      if (state.userInfo) {
        commit('SET_NAME', state.userInfo.adminInfo.cnName) // 登陆人名字
        commit('SET_AVATAR', state.userInfo)
        return resolve(state.userInfo)
      } else {
        return reject('验证失败，请重新登录。')
      }
    })
  },

  // 用户退出登陆
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      // 有退出接口的话换成自己退出的接口，成功返回成功的promise，失败返回失败的
      removeToken() // must remove  token  first
      resetRouter()
      commit('RESET_STATE')
      resolve()
      // logout(state.token).then(() => {
      //   removeToken() // must remove  token  first
      //   resetRouter()
      //   commit('RESET_STATE')
      //   resolve()
      // }).catch(error => {
      //   reject(error)
      // })
    })
  },

  // 退出时 或者 token 失效时 删除本地储存的 token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

